package com.igeek.boot.beandefinition;

import com.igeek.boot.entity.Car;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

/**
 * @Author fengqq
 * @Description bean的定义
 * @Date 2024/8/14  9:35
 *
 * 声明式定义bean:xml  / @Bean / @Component等
 * 编程式定义bean：直接将bean的定义信息 注册到IOC容器中 (声明式定义bean的底层原理)
 */

public class MainTest {
    public static void main(String[] args) {
        //1.获取ioc容器
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        //2.通过BeanDefinition 直接注册bean 到 ioc容器中
        //2.1 构建 BeanDefinition 使用构建者模式
        AbstractBeanDefinition beanDefinition =
                BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
        //2.2 设置类的信息
        beanDefinition.setBeanClass(Car.class);
        //2.3 设置属性的信息
        beanDefinition.setScope("singleton");
        //2.4 BeanDefinition 直接注册bean 到 ioc容器（本质上Map<String,BeanDefinition>）中
        context.registerBeanDefinition("car",beanDefinition);
        //2.5 刷新后 才注册完成
        context.refresh();

        System.out.println("--------------------------");
        //3.获取bean
        Car car = context.getBean("car", Car.class);
        System.out.println("car = " + car);
    }
}
